From bb7b81a8c5e52891c8c90b7cbdb3d6c49cdbd641 Mon Sep 17 00:00:00 2001 From: robertl Date: Tue, 3 Jun 2003 20:50:05 +0000 Subject: [PATCH] Don't strip exteriour quotes from fields. From Mottram. --- gpsbabel/csv_util.c | 27 +++++++++++++++++---------- gpsbabel/csv_util.h | 4 ++-- gpsbabel/internal_styles.c | 6 +++--- gpsbabel/style/mxf.style | 6 +++--- gpsbabel/tmpro.c | 6 +++--- gpsbabel/xcsv.c | 22 +++++++++++----------- 6 files changed, 39 insertions(+), 32 deletions(-) diff --git a/gpsbabel/csv_util.c b/gpsbabel/csv_util.c index 2c2cba10f..9d3c7701a 100644 --- a/gpsbabel/csv_util.c +++ b/gpsbabel/csv_util.c @@ -83,19 +83,20 @@ csv_stringclean(const char *string, const char *chararray) /***********************************************************************************/ /* csv_stringtrim() - trim whitespace and leading and trailing enclosures (quotes) */ /* returns a copy of the modified string */ -/* usage: p = csv_stringtrim(string, "\"") */ +/* usage: p = csv_stringtrim(string, "\"", 0) */ /***********************************************************************************/ char * #ifdef DEBUG_MEM -CSV_STRINGTRIM(const char *string, const char *enclosure,DEBUG_PARAMS) +CSV_STRINGTRIM(const char *string, const char *enclosure, int strip_max, DEBUG_PARAMS) #else -csv_stringtrim(const char *string, const char *enclosure) +csv_stringtrim(const char *string, const char *enclosure, int strip_max) #endif { static const char *p1 = NULL; char *p2 = NULL; char * tmp = xxstrdup(string,file,line); size_t elen; + int stripped = 0; if (!strlen(string)) { return (tmp); @@ -120,13 +121,19 @@ csv_stringtrim(const char *string, const char *enclosure) p1++; } + /* if no maximum strippage, assign a reasonable value to max */ + strip_max = strip_max ? strip_max : 9999; + /* if we have enclosures, skip past them in pairs */ if (elen) { - while (((size_t) (p2 - p1) > elen) && + while ( + (stripped < strip_max) && + ((size_t) (p2 - p1) > elen) && (strncmp(p1, enclosure, elen) == 0) && (strncmp((p2 - elen + 1), enclosure, elen) == 0)) { p2 -= elen; p1 += elen; + stripped++; } } @@ -394,22 +401,22 @@ xcsv_parse_val(const char *s, waypoint *wpt, const field_map_t *fmp) /* IGNORE -- Calculated Sequence # For Ouput*/ } else if (strcmp(fmp->key, "SHORTNAME") == 0) { - wpt->shortname = csv_stringtrim(s, ""); + wpt->shortname = csv_stringtrim(s, "", 0); } else if (strcmp(fmp->key, "DESCRIPTION") == 0) { - wpt->description = csv_stringtrim(s, ""); + wpt->description = csv_stringtrim(s, "", 0); } else if (strcmp(fmp->key, "NOTES") == 0) { - wpt->notes = csv_stringtrim(s, ""); + wpt->notes = csv_stringtrim(s, "", 0); } else if (strcmp(fmp->key, "URL") == 0) { - wpt->url = csv_stringtrim(s, ""); + wpt->url = csv_stringtrim(s, "", 0); } else if (strcmp(fmp->key, "URL_LINK_TEXT") == 0) { - wpt->url_link_text = csv_stringtrim(s, ""); + wpt->url_link_text = csv_stringtrim(s, "", 0); } else if (strcmp(fmp->key, "ICON_DESCR") == 0) { - wpt->icon_descr = csv_stringtrim(s, ""); + wpt->icon_descr = csv_stringtrim(s, "", 0); wpt->icon_descr_is_dynamic = 1; } else diff --git a/gpsbabel/csv_util.h b/gpsbabel/csv_util.h index cd0d19acd..a0bd4c09b 100644 --- a/gpsbabel/csv_util.h +++ b/gpsbabel/csv_util.h @@ -21,9 +21,9 @@ char * #ifndef DEBUG_MEM -csv_stringtrim(const char *string, const char *enclosure); +csv_stringtrim(const char *string, const char *enclosure, int strip_max); #else -CSV_STRINGTRIM(const char *string, const char *enclosure, DEBUG_PARAMS); +CSV_STRINGTRIM(const char *string, const char *enclosure, int strip_max, DEBUG_PARAMS); #define csv_stringtrim( s, e ) CSV_STRINGTRIM( s, e, __FILE__, __LINE__); #endif diff --git a/gpsbabel/internal_styles.c b/gpsbabel/internal_styles.c index abb612bd8..b16d33850 100644 --- a/gpsbabel/internal_styles.c +++ b/gpsbabel/internal_styles.c @@ -237,7 +237,7 @@ static char mxf[] = "#\n" "FIELD_DELIMITER COMMASPACE\n" "RECORD_DELIMITER NEWLINE\n" -"BADCHARS COMMA\n" +"BADCHARS \",\n" "#\n" "# INDIVIDUAL DATA FIELDS, IN ORDER OF APPEARANCE:\n" @@ -253,8 +253,8 @@ static char mxf[] = "OFIELD LAT_DECIMAL, \"\", \"%08.5f\"\n" "OFIELD LON_DECIMAL, \"\", \"%08.5f\"\n" "OFIELD DESCRIPTION, \"\", \"\"%s\"\"\n" -"OFIELD SHORTNAME, \"\", \"%s\"\n" -"OFIELD DESCRIPTION, \"\", \"%s\"\n" +"OFIELD SHORTNAME, \"\", \"\"%s\"\"\n" +"OFIELD DESCRIPTION, \"\", \"\"%s\"\"\n" "OFIELD CONSTANT, \"ff0000\", \"%s\" # COLOR\n" "OFIELD CONSTANT, \"47\", \"%s\" # ICON\n" ; diff --git a/gpsbabel/style/mxf.style b/gpsbabel/style/mxf.style index 44643f1a2..e0229b792 100644 --- a/gpsbabel/style/mxf.style +++ b/gpsbabel/style/mxf.style @@ -17,7 +17,7 @@ EXTENSION mxf # FIELD_DELIMITER COMMASPACE RECORD_DELIMITER NEWLINE -BADCHARS COMMA +BADCHARS ", # # INDIVIDUAL DATA FIELDS, IN ORDER OF APPEARANCE: @@ -33,7 +33,7 @@ IFIELD CONSTANT, "47", "%s" # ICON OFIELD LAT_DECIMAL, "", "%08.5f" OFIELD LON_DECIMAL, "", "%08.5f" OFIELD DESCRIPTION, "", ""%s"" -OFIELD SHORTNAME, "", "%s" -OFIELD DESCRIPTION, "", "%s" +OFIELD SHORTNAME, "", ""%s"" +OFIELD DESCRIPTION, "", ""%s"" OFIELD CONSTANT, "ff0000", "%s" # COLOR OFIELD CONSTANT, "47", "%s" # ICON diff --git a/gpsbabel/tmpro.c b/gpsbabel/tmpro.c index 379f65ae3..32bc6f812 100644 --- a/gpsbabel/tmpro.c +++ b/gpsbabel/tmpro.c @@ -107,13 +107,13 @@ data_read(void) /* ignore: group */ break; case 1: - wpt_tmp->shortname = csv_stringtrim(s, ""); + wpt_tmp->shortname = csv_stringtrim(s, "", 0); break; case 2: /* Description is not a TopoMapPro format requirement. If we assign "" then .loc/.gpx will generate empty XML tags :( */ - holder = csv_stringtrim(s, ""); + holder = csv_stringtrim(s, "", 0); if (strlen(holder)) wpt_tmp->description = holder; break; @@ -145,7 +145,7 @@ data_read(void) use the TopoMapLinks links. (plus discards length 0 strings (so no empty XML tags)) */ - holder = csv_stringtrim(s, ""); + holder = csv_stringtrim(s, "", 0); if (strstr(holder, "http:") != NULL) wpt_tmp->url = holder; break; diff --git a/gpsbabel/xcsv.c b/gpsbabel/xcsv.c index f17d713cf..e3edbecc8 100644 --- a/gpsbabel/xcsv.c +++ b/gpsbabel/xcsv.c @@ -190,7 +190,7 @@ xcsv_parse_style_line(const char *sbuff) if (strlen(sbuff)) { if (ISSTOKEN(sbuff, "FIELD_DELIMITER")) { - sp = csv_stringtrim(&sbuff[16], "\""); + sp = csv_stringtrim(&sbuff[16], "\"", 1); cp = get_char_from_constant_table(sp); if (cp) { xcsv_file.field_delimiter = xstrdup(cp); @@ -201,7 +201,7 @@ xcsv_parse_style_line(const char *sbuff) } else if (ISSTOKEN(sbuff, "RECORD_DELIMITER")) { - sp = csv_stringtrim(&sbuff[17], "\""); + sp = csv_stringtrim(&sbuff[17], "\"", 1); cp = get_char_from_constant_table(sp); if (cp) { xcsv_file.record_delimiter = xstrdup(cp); @@ -212,11 +212,11 @@ xcsv_parse_style_line(const char *sbuff) } else if (ISSTOKEN(sbuff, "DESCRIPTION")) { - xcsv_file.description = csv_stringtrim(&sbuff[11],""); + xcsv_file.description = csv_stringtrim(&sbuff[11],"", 0); } else if (ISSTOKEN(sbuff, "EXTENSION")) { - xcsv_file.extension = csv_stringtrim(&sbuff[10],""); + xcsv_file.extension = csv_stringtrim(&sbuff[10],"", 0); } else if (ISSTOKEN(sbuff, "SHORTLEN")) { @@ -230,7 +230,7 @@ xcsv_parse_style_line(const char *sbuff) } else if (ISSTOKEN(sbuff, "BADCHARS")) { - sp = csv_stringtrim(&sbuff[9], "\""); + sp = csv_stringtrim(&sbuff[9], "\"", 1); cp = get_char_from_constant_table(sp); if (cp) { xcsv_file.badchars = xstrdup(cp); @@ -258,15 +258,15 @@ xcsv_parse_style_line(const char *sbuff) switch(i) { case 0: /* key */ - key = csv_stringtrim(s, "\""); + key = csv_stringtrim(s, "\"", 1); break; case 1: /* default value */ - val = csv_stringtrim(s, "\""); + val = csv_stringtrim(s, "\"", 1); break; case 2: /* printf conversion */ - pfc = csv_stringtrim(s, "\""); + pfc = csv_stringtrim(s, "\"", 1); break; default: break; @@ -295,15 +295,15 @@ xcsv_parse_style_line(const char *sbuff) switch(i) { case 0: /* key */ - key = csv_stringtrim(s, "\""); + key = csv_stringtrim(s, "\"", 1); break; case 1: /* default value */ - val = csv_stringtrim(s, "\""); + val = csv_stringtrim(s, "\"", 1); break; case 2: /* printf conversion */ - pfc = csv_stringtrim(s, "\""); + pfc = csv_stringtrim(s, "\"", 1); break; default: break; -- 2.30.2